-- EffectAnimation
-- Created by chengb May/12/2015
-- 特效动画支持

-- EffectAnimation继承自Node
EffectAnimation = class("EffectAnimation", function()
    return cc.Node:create();
end);

function EffectAnimation.create(filePath, speed)
    return EffectAnimation.new(filePath, speed);
end

-- 构造函数
-- @param filePath 动画文件路径
function EffectAnimation:ctor(filePath, speed)
    -- 载入动画
    local node, animAction;
    node, animAction = AnimationCacheM.createAnimationNodeAndAction(filePath);
    self.node = node;
    self.action = animAction;
    self.filePath = filePath;

    self:addChild(node);
    node:runAction(animAction);

    self.speed = speed;

    self.hasDestroyed = false;

    -- 界面析构后，需要清理下
    self:registerScriptHandler(function(eventType)
        if eventType == "exit" then
            AnimationCacheM.freeAnimationNodeAndAction(self.filePath, self.node, self.action);
            self.node = nil;
            self.action = nil;
            self.filePath = nil;
        end
    end);
end

-----------------------------
-- 播放
-- @param startIndex   起始帧
-- @param endIndex     结束帧
-- @param loop         是否循环播放
-- @param speed        播放速度
-- @param callback     回调函数
function EffectAnimation:play(startIndex, endIndex, loop, speed, callback)
    loop = loop or false;

    -- 如果传入了播放速度，优先使用，否则使用通用的速度
    if speed then
        self.action:setTimeSpeed(speed);
    elseif self.speed then
        self.action:setTimeSpeed(self.speed);
    end

    -- 播放
    if endIndex == nil then
        self.action:gotoFrameAndPlay(startIndex, loop);
    else
        self.action:gotoFrameAndPlay(startIndex, endIndex, loop);
    end

    if loop then
        -- 循环播放时，不应该有callback，因此不需要调用回调，直接返回
        return;
    end

    self.callback = callback;

    -- 注册帧回调事件
    self:registerFrameEvent(endIndex);
end

------------------------------
-- 停留在某帧
-- @param toIndex 目标帧
function EffectAnimation:gotoFrameAndPause(toIndex)
    self.action:gotoFrameAndPause(toIndex);
end

-- 暂停播放
function EffectAnimation:pause()
    self.action:pause();
end

-- 注册帧回调函数
function EffectAnimation:registerFrameEvent(endIndex)
    -- 移除帧回调处理函数
    self.action:clearFrameEventCallFunc();

    -- 帧回调处理函数
    local function onFrameEvent(frame)
        if nil == frame or nil == endIndex then
            return;
        end

        -- 使用pilor帧，确保每帧都会有回调过来
        if frame.getEvent and frame:getEvent() == "pilor" then
            -- 帧索引的下标是从0开始的，而配置的下标是从1开始的，故这里要加1
            local frameIndex = frame:getFrameIndex() + 1;

            -- 尚未到达结束帧，不处理
            if frameIndex < endIndex then
                return;
            end

            if self.action then
                -- 停在结束帧
                self.action:gotoFrameAndPause(endIndex);

                -- 移除帧回调处理函数
                self.action:clearFrameEventCallFunc();
            end

            -- 如果有回调，则执行一下
            if type(self.callback) == 'function' then
                -- 这里必须先将回调函数取出来，因为回调函数中有可能会对callback进行赋值
                local f = self.callback;
                self.callback = nil;
                f();
            end
        end
    end

    -- 设置帧回调处理函数
    self.action:setFrameEventCallFunc(onFrameEvent);
end


